package aterrizar;

import aterrizar.exceptions.AsientoNoDisponibleException;
import aterrizar.exceptions.AsientoYaLiberadoException;

public class Asiento {

	public enum EstadoAsiento {
		DISPONIBLE, NO_DISPONIBLE
	}

	private Clase clase;
	private EstadoAsiento estado;
	private Reserva reserva;
	private int numeroAsiento;

	public Asiento(Clase clase, EstadoAsiento estado) {
		this.clase = clase;
		this.estado = estado;
	}
	
	public Asiento(Clase clase) {
		this.clase = clase;
		this.estado = EstadoAsiento.DISPONIBLE;
	}
	
	public Asiento(Clase clase, int numeroAsiento) {
		this.clase = clase;
		this.numeroAsiento = numeroAsiento;
		this.estado = EstadoAsiento.DISPONIBLE;
	}
	
	@Override
	public boolean equals(Object obj) {
		if ( this == obj ) return true;
		if ( !(obj instanceof Asiento) ) return false;
		Asiento asiento = (Asiento) obj;
		return numeroAsiento == asiento.numeroAsiento;
	}
	
	public void reservar(Reserva reserva) throws AsientoNoDisponibleException {
		chequearDisponibilidad(reserva);
		estado = EstadoAsiento.NO_DISPONIBLE;
		this.reserva = reserva;
	}

	public void comprar() throws AsientoNoDisponibleException {
		comprar(null);
	}
	
	public void comprar(Reserva reserva) throws AsientoNoDisponibleException {
		chequearDisponibilidad(reserva);
		estado = EstadoAsiento.NO_DISPONIBLE;
	}

	private void chequearDisponibilidad(Reserva reserva) throws AsientoNoDisponibleException {
		if ( !estoyDisponible() && ( reserva == null || this.reserva == null || !reserva.equals(this.reserva) ) ) {
			throw new AsientoNoDisponibleException("El asiento no esta disponible");
		}
	}
	
	public boolean estoyDisponible() {
		if (estado.equals(EstadoAsiento.DISPONIBLE)) {
			return true;
		}
		return false;
	}
	
	public void liberar() throws AsientoYaLiberadoException {
		if (estado.equals(EstadoAsiento.DISPONIBLE)) {
			throw new AsientoYaLiberadoException("El asiento ya fue liberado");
		} else {
			estado = EstadoAsiento.DISPONIBLE;
		}
	}

	public Clase getClase() {
		return clase;
	}

	public int getNumeroAsiento() {
		return numeroAsiento;
	}

	public void setNumeroAsiento(int numeroAsiento) {
		this.numeroAsiento = numeroAsiento;
	}

}
